package com.test.demo.config;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.springframework.context.annotation.Configuration;

import java.util.Collection;

/**
 * shardingJdbc数据库分片策略实现
 * 备注：
 * 标准分片策略。提供对SQL语句中的=, IN和AND的分片操作支持。
 * StandardShardingStrategy只支持单分片键，提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。
 * 1、PreciseShardingAlgorithm是必选的，用于处理=、IN、AND分片的SQL。
 * 2、RangeShardingAlgorithm是可选的，用于处理BETWEEN分片(但经过测试，发现BETWEEN分片并没激活此规则)
 * 3、SQL中的BETWEEN查询条件不支持
 * @author
 */
@Configuration
public class ShardingDatabasePreciseAlgorithm implements PreciseShardingAlgorithm<String> {

    public static final Integer DATABASE_NUM = 2;

    public ShardingDatabasePreciseAlgorithm() {}

    /**
     * 用于处理=、IN、AND的分片
     *
     * @param availableTargetNames 可用的数据库名称
     * @param shardingValue 分片值
     * @return 最终分片的数据库名称
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
        ///int moldingValue = Math.abs(shardingValue.getValue().hashCode() % DATABASE_NUM);
        long moldingValue = Long.valueOf(shardingValue.getValue()) % DATABASE_NUM;
        for (String databaseName : availableTargetNames){
            if (databaseName.endsWith(moldingValue + "")) {
                return databaseName;
            }
        }
        throw new IllegalArgumentException();
    }
}
